#!/bin/bash
###############################################################################
# File name:
#     atlas_reset.sh
#
# Description:
#     You can reset atlas modules in aes100.
#
# $1 - Atlas module number
#
# The atlas modules(RC mode) are mapped in machine as following:
# |21(F1)|22(F2)|23(F3)|24(F4)|  ttyS9
# |17(E1)|18(E2)|19(E3)|20(E4)|  ttyS8
# |13(D1)|14(D2)|15(D3)|16(D4)|  ttyS7
# |09(C1)|10(C2)|11(C3)|12(C4)|  ttyS6
# |05(B1)|06(B2)|07(B3)|08(B4)|  ttyS5
# |01(A1)|02(A2)|03(A3)|04(A4)|  ttyS4
#
# The atlas modules(EP mode) are mapped on COMe as following:
# |25(CN17(R))|26(CN18(L))|
#
# 1. Run the script with the module number inputed. 
# Exp: ./atlas_reset.sh 1  Reset the atlas module A1.
###############################################################################
set +x

gpio_reset_init=0x0f
reset_mod_1_l=0xfe
reset_mod_1_h=0x01
reset_mod_2_l=0xfd
reset_mod_2_h=0x02
reset_mod_3_l=0xfb
reset_mod_3_h=0x04
reset_mod_4_l=0xf7
reset_mod_4_h=0x08
reset_host_1_l=0xbf
reset_host_1_h=0x40
reset_host_2_l=0x7f
reset_host_2_h=0x80

# Initial the gpios as output
function gpio_init()
{
    #A1 A2 A3 A4
    lHRAT -i2c -w8 0 0x25 0x06 0x00
    
    #B1 B2 B3 B4
    lHRAT -i2c -w8 0 0x25 0x07 0x00
    
    #C1 C2 C3 C4
    lHRAT -i2c -w8 0 0x21 0x06 0x00
    
    #D1 D2 D3 D4
    lHRAT -i2c -w8 0 0x21 0x07 0x00
    
    #E1 E2 E3 E4
    lHRAT -i2c -w8 0 0x22 0x06 0x00
    
    #F1 F2 F3 F4
    lHRAT -i2c -w8 0 0x22 0x07 0x00
}

# Configure the PCA9535 register value
function pca9535_config()
{
    atlas_num=$1
    case $atlas_num in
    #A1 #CN11-CN1
    1)
    rstl=$reset_mod_1_l
    rsth=$reset_mod_1_h
    addr=0x25
    cmd=0x02 
    ;;
    #A2 #CN11-CN2
    2)
    rstl=$reset_mod_2_l
    rsth=$reset_mod_2_h
    addr=0x25
    cmd=0x02     
    ;;
    #A3 #CN11-CN3
    3)
    rstl=$reset_mod_3_l
    rsth=$reset_mod_3_h
    addr=0x25
    cmd=0x02    
    ;;
    #A4 #CN11-CN4
    4)
    rstl=$reset_mod_4_l
    rsth=$reset_mod_4_h
    addr=0x25
    cmd=0x02   
    ;;
    #B1 #CN12-CN1
    5)
    rstl=$reset_mod_1_l
    rsth=$reset_mod_1_h
    addr=0x25
    cmd=0x03
    ;;
    #B2 #CN12-CN2
    6)
    rstl=$reset_mod_2_l
    rsth=$reset_mod_2_h
    addr=0x25
    cmd=0x03
    ;;
    #B3 #CN12-CN3
    7)
    rstl=$reset_mod_3_l
    rsth=$reset_mod_3_h
    addr=0x25
    cmd=0x03
    ;;
    #B4 #CN12-CN4
    8)
    rstl=$reset_mod_4_l
    rsth=$reset_mod_4_h
    addr=0x25
    cmd=0x03
    ;;
    #C1 #CN13-CN1
    9)
    rstl=$reset_mod_1_l
    rsth=$reset_mod_1_h
    addr=0x21
    cmd=0x02
    ;;
    #C2 #CN13-CN2
    10)
    rstl=$reset_mod_2_l
    rsth=$reset_mod_2_h
    addr=0x21
    cmd=0x02
    ;;
    #C3 #CN13-CN3
    11)
    rstl=$reset_mod_3_l
    rsth=$reset_mod_3_h
    addr=0x21
    cmd=0x02
    ;;
    #C4 #CN13-CN4
    12)
    rstl=$reset_mod_4_l
    rsth=$reset_mod_4_h
    addr=0x21
    cmd=0x02
    ;;
    #D1 #CN14-CN1
    13)
    rstl=$reset_mod_1_l
    rsth=$reset_mod_1_h
    addr=0x21
    cmd=0x03
    ;;
    #D2 #CN14-CN2
    14)
    rstl=$reset_mod_2_l
    rsth=$reset_mod_2_h
    addr=0x21
    cmd=0x03
    ;;
    #D3 #CN14-CN3
    15)
    rstl=$reset_mod_3_l
    rsth=$reset_mod_3_h
    addr=0x21
    cmd=0x03
    ;;
    #D4 #CN14-CN4
    16)
    rstl=$reset_mod_4_l
    rsth=$reset_mod_4_h
    addr=0x21
    cmd=0x03
    ;;
    #E1
    17) #CN15-CN1
    rstl=$reset_mod_1_l
    rsth=$reset_mod_1_h
    addr=0x22
    cmd=0x02 
    ;;
    #E2
    18) #CN15-CN2
    rstl=$reset_mod_2_l
    rsth=$reset_mod_2_h
    addr=0x22
    cmd=0x02
    ;;
    #E3
    19) #CN15-CN3
    rstl=$reset_mod_3_l
    rsth=$reset_mod_3_h
    addr=0x22
    cmd=0x02
    ;;
    #E4
    20) #CN15-CN4
    rstl=$reset_mod_4_l
    rsth=$reset_mod_4_h
    addr=0x22
    cmd=0x02
    ;;
    #F1 #CN16-CN1
    21)
    rstl=$reset_mod_1_l
    rsth=$reset_mod_1_h
    addr=0x22
    cmd=0x03
    ;;
    #F2 #CN16-CN2
    22)
    rstl=$reset_mod_2_l
    rsth=$reset_mod_2_h
    addr=0x22
    cmd=0x03
    ;;
    #F3 #CN16-CN3
    23)
    rstl=$reset_mod_3_l
    rsth=$reset_mod_3_h
    addr=0x22
    cmd=0x03
    ;;
    #F4 #CN16-CN4
    24)
    rstl=$reset_mod_4_l
    rsth=$reset_mod_4_h
    addr=0x22
    cmd=0x03
    ;;
    #CN17(R)
    25)
    rstl=$reset_host_1_l
    rsth=$reset_host_1_h
    addr=0x22
    cmd=0x03
    ;;
    #CN18(L)
    26)
    rstl=$reset_host_2_l
    rsth=$reset_host_2_h
    addr=0x22
    cmd=0x03
    ;;    
    *)
    exit 1
    ;;
    esac
}

# Reset the atlas module
function atlas_reset()
{
    val_tmp=$(lHRAT -i2c -r8 0 $addr $cmd|awk -F: '{print $2}')
    val=$(((val_tmp|gpio_reset_init)&rstl))
    lHRAT -i2c -w8 0 $addr $cmd $val
    sleep 1
    val=$((val_tmp|gpio_reset_init|rsth))
    lHRAT -i2c -w8 0 $addr $cmd $val
}

# Print the Atlas mapping
function print_map()
{
    echo "|21(F1)|22(F2)|23(F3)|24(F4)| ttyS9"
    echo "|17(E1)|18(E2)|19(E3)|20(E4)| ttyS8"
    echo "|13(D1)|14(D2)|15(D3)|16(D4)| ttyS7"
    echo "|09(C1)|10(C2)|11(C3)|12(C4)| ttyS6"
    echo "|05(B1)|06(B2)|07(B3)|08(B4)| ttyS5"
    echo "|01(A1)|02(A2)|03(A3)|04(A4)| ttyS4"
    echo "|25(CN17(R))|26(CN18(L))|"
}

################################################################################
#main
if [ X$1 = X ];then
    print_map
    exit 1
elif [ $1 -lt 1 ] || [ $1 -gt 26 ];then
    echo "The atlas module number is wrong!"
    exit 1
fi

gpio_init
pca9535_config $1
atlas_reset

exit 0

